//package com.zlcx.tz.live.queue;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.zlcx.tz.live.constant.RedisKeyConst;
//import com.zlcx.tz.live.dao.pojo.LiveRoomInfo;
//import com.zlcx.tz.live.service.FFMPEGService;
//import com.zlcx.tz.live.service.LiveRoomService;
//import com.zlcx.tz.live.utils.IPUtil;
//import com.zlcx.tz.live.vo.RecordVideoMessage;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang.StringEscapeUtils;
//import org.apache.commons.lang.StringUtils;
//import org.apache.commons.lang3.time.DateFormatUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.core.task.AsyncTaskExecutor;
//import org.springframework.data.redis.connection.Message;
//import org.springframework.data.redis.connection.MessageListener;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StopWatch;
//
//import javax.annotation.Resource;
//import java.io.File;
//import java.util.Date;
//import java.util.concurrent.TimeUnit;
//
///**
// * <p>开始合成视频监听</p>
// * <PRE>
// * <BR>    修改记录
// * <BR>-----------------------------------------------
// * <BR>    修改日期         修改人          修改内容
// * </PRE>
// *
// * @author zl
// * @version 1.0
// * @date Created in 2019/6/18 13:28
// * @copyright: Copyright (c) founders
// */
//@Slf4j
//@Component
//public class SubscribeRecordVideoListener implements MessageListener {
//
//    private static String iptag;
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    @Value("${ffmpeg.hostprefix}")
//    private String hostprefix;
//
//    @Value("${ffmpeg.path.video}")
//    private String videoPath;
//
//    @Value("${agora.agoraRecordDir}")
//    private String agoraRecordDir;
//
//    @Resource(name="recordExecutor")
//    private AsyncTaskExecutor recordExecutor;
//
//    @Autowired
//    private FFMPEGService ffmpegService;
//
//    @Autowired
//    private LiveRoomService roomService;
//
//
//    static {
//        try {
//            String ipV4Str = IPUtil.getIpV4Address();
//            ipV4Str=ipV4Str.substring(ipV4Str.indexOf(".")+1);
//            ipV4Str=ipV4Str.substring(ipV4Str.indexOf(".")+1);
//            iptag=ipV4Str.replace(".","-");
//        }catch (Exception e){
//            log.error("无法获取本地Ip地址，e={}",e);
//        }
//    }
//
//
//    /**
//     * 1、先根据目录判断在本节点是否存在，如果不存在直接结束
//     * 2、redis中标记合成图片状态正在进行中
//     * 3、根据上麦开始时间筛选图片并合成视频，放在一个按照日期/roomid/userid存储的目录中
//     * 4、如果合成成功，拼接访问的url  hostprefix/节点IP标识/yyyyMMdd/roomId/userId/fileName
//     * 5、放入redis中
//     * 6、删除redis中标记合成图片状态
//     * 注：在重新连麦时需要删除redis key
//     *
//     * @param message
//     * @param pattern
//     */
//    @Override
//    public void onMessage(Message message, byte[] pattern) {
//
//        recordExecutor.execute(()->{
//
//            String body = new String(message.getBody());
//            body = StringEscapeUtils.unescapeJavaScript(body);
//            body = body.startsWith("\"")?body.substring(1):body;
//            body = body.endsWith("\"")?body.substring(0,body.length()-1):body;
//            log.info("开始合成视频消息,message={}", body);
//            StopWatch stopWatch = new StopWatch();
//            stopWatch.start();
//            String createVideoStatusKey =null;
//            try {
//                RecordVideoMessage videoMessage = JSON.parseObject(body,RecordVideoMessage.class);
//                //step 1
//                File recordingDir = null;
//                if(StringUtils.isBlank(videoMessage.getRecordingDir())){
//                    LiveRoomInfo roomInfo = roomService.getRoomInfoNoState(videoMessage.getRoomId());
//                    if(roomInfo==null){
//                        log.error("房间不存在，roomId={}",videoMessage.getRoomId());
//                        return;
//                    }
//                    File agoraPath = new File(agoraRecordDir+"/"+DateFormatUtils.format(roomInfo.getCreateTime(),"yyyyMMdd"));
//                    File[] listFiles = agoraPath.listFiles();
//                    if(listFiles!=null){
//                        for(File tempFile :listFiles){
//                            if(tempFile.isDirectory() && tempFile.getAbsolutePath().indexOf("/"+videoMessage.getRoomId()+"_")>0){
//                                recordingDir = tempFile;
//                                break;
//                            }
//                        }
//                    }
//
//                }else {
//                    recordingDir = new File(videoMessage.getRecordingDir());
//                }
//
//                if(recordingDir ==null || !recordingDir.exists()){
//                    log.info("房间录制目录不存在，roomId={}",videoMessage.getRoomId());
//                    return;
//                }
//                videoMessage.setRecordingDir(recordingDir.getAbsolutePath());
//
//                //step 2
//                createVideoStatusKey = RedisKeyConst.getCreateVideoStatusKey(videoMessage.getUserId(),videoMessage.getRoomId());
//                redisTemplate.opsForValue().set(createVideoStatusKey,2,10, TimeUnit.MINUTES);
//
//
//                StringBuilder filePath = new StringBuilder();
//                filePath.append("/").append(DateFormatUtils.format(new Date(),"yyyyMMdd"))
//                        .append("/").append(videoMessage.getRoomId()).append("/").append(videoMessage.getUserId());
//
//                //step 3
//
//                String videoAbsolutePath = videoPath+filePath.toString();
//                File absoluteDir = new File(videoAbsolutePath);
//                if(!recordingDir.exists()){
//                    absoluteDir.mkdirs();
//                }
//                String fileName = ffmpegService.createVideo(videoMessage.getUserId(),videoMessage.getRoomId(),recordingDir.getAbsolutePath(),videoAbsolutePath);
//
//                //step 4
//                StringBuilder videoUrl = new StringBuilder();
//                videoUrl.append(hostprefix).append("/").append(iptag).append(filePath.toString())
//                        .append("/").append(fileName);
//
//                Long totalTimeMillis = stopWatch.getTotalTimeMillis();
//                stopWatch.stop();
//                log.info("视频合成成功，totalTimeMillis={},filePath={},fileUrl={}",totalTimeMillis,absoluteDir.getAbsolutePath()+"/"+fileName,videoUrl.toString());
//
//                //step 5
//                String userVideoUrlKey = RedisKeyConst.getUserVideoUrlKey(videoMessage.getUserId(),videoMessage.getRoomId());
//                redisTemplate.opsForValue().set(userVideoUrlKey,videoUrl.toString(),1, TimeUnit.HOURS);
//
//
//            }catch (Exception e){
//                log.error("开始合成视频消息处理失败，message={},e={}",message,e);
//            }finally {
//                //step 6
//                redisTemplate.delete(createVideoStatusKey);
//            }
//
//
//
//        });
//
//    }
//
//}
